home *** CD-ROM | disk | FTP | other *** search
/ Over 1,000 Windows 95 Programs / Over 1000 Windows 95 Programs (Microforum) (Disc 1).iso / 0362 / bcsdk.zip / BCDDELIB.C < prev    next >
C/C++ Source or Header  |  1995-04-01  |  7KB  |  322 lines

  1. /*
  2.     BarClock(tm)
  3.  
  4.     DDE Library v1.0
  5.  
  6.     Copyright (c) 1995  Patrick Breen
  7.     All rights reserved.
  8.  
  9.     Requires BarClock/BarClock PLUS v4.0 or later.
  10.  
  11.     Atomic Dog Software
  12.     PO Box 523
  13.     Medford, MA 02155
  14.  
  15.     Phone (617) 396-2673
  16.     Fax   (617) 396-5761
  17.  
  18.     Internet:            pbreen@world.std.com
  19.     CompuServe:         70312,743
  20.     America Online:     PBreen
  21.  
  22.     FTP:     ftp.std.com    /vendors/AtomicDog
  23. */
  24.  
  25. #include "bcddelib.h"
  26. #include <ddeml.h>
  27.  
  28. //Stolen from Windows 3.1 DDK WINNET.H
  29. WORD FAR PASCAL WNetGetCaps(WORD);
  30. typedef BOOL (FAR PASCAL *LPFNWINNETBROWSE)(HWND, LPSTR, LPSTR, UINT, DWORD);
  31.  
  32. // Global data
  33. DWORD idInst = 0;
  34.  
  35. // Local data
  36. static char host[64] = "";
  37. char cmdBuf[512];
  38.  
  39. // Local functions
  40. static short ddeStdExecute(short id, char FAR *pName);
  41. static short ddeInfoExecute(short id, char FAR *pName, char FAR *pMsg, char FAR *pWave, char FAR *pApp);
  42.  
  43.  
  44. // ******************
  45. //
  46. //   INIT FUNCTIONS
  47. //
  48. // ******************
  49.  
  50. short BCDdeLibInit(FARPROC lpfnCallback, DWORD afCmd)
  51. {
  52.     // Already inited?
  53.     if (idInst)
  54.         return BCDDE_MULTIPLEINIT;
  55.  
  56.     // Use default filters?
  57.     if (lpfnCallback == NULL)
  58.         afCmd = APPCMD_CLIENTONLY | CBF_FAIL_ALLSVRXACTIONS | CBF_SKIP_ALLNOTIFICATIONS;
  59.  
  60.     // Start conversation
  61.     if (DdeInitialize(&idInst, (PFNCALLBACK) lpfnCallback, afCmd, 0l) != DMLERR_NO_ERROR) {
  62.  
  63.         idInst = 0;
  64.     }
  65.  
  66.     // Set return inst
  67.  
  68.     return ((idInst)? BCDDE_NOERROR:BCDDE_INITFAIL);
  69. }
  70.  
  71. void BCDdeLibFree(void)
  72. {
  73.     // Disconnect
  74.     if (idInst) DdeUninitialize(idInst);
  75.     idInst = 0;
  76. }
  77.  
  78.  
  79. // *************
  80. //
  81. //   MAIN EXEC
  82. //
  83. // *************
  84.  
  85. short BCDdeExecute(char FAR *pCommand)
  86. {
  87.     char serviceBuf[256];
  88.     LPSTR pService = "BarClock";
  89.     HCONV hConv;
  90.     HSZ hszTopic = (HSZ) 0;
  91.     HSZ hszService;
  92.     short err = BCDDE_EXECFAIL;
  93.  
  94.     if (idInst == 0) return BCDDE_NOINIT;
  95.  
  96.     // If a host is specified, build
  97.     // include host name in service
  98.     if (host[0]) {
  99.  
  100.         // Set service name
  101.         wsprintf(serviceBuf, "%s\\NDDE$", (LPSTR) host);
  102.         pService = serviceBuf;
  103.     }
  104.  
  105.     // Create service string
  106.     hszService = DdeCreateStringHandle(idInst, pService, CP_WINANSI);
  107.  
  108.     // Allocate topic
  109.     hszTopic = (host[0])? DdeCreateStringHandle(idInst, "BARCLK$", CP_WINANSI):hszService;
  110.  
  111.     // Start conversation
  112.     if (hszService && ((hConv = DdeConnect(idInst, hszService, hszTopic, NULL)) != (HCONV) 0)) {
  113.  
  114.         // Execute command
  115.         if (DdeClientTransaction((void FAR *) pCommand,
  116.                             lstrlen(pCommand) + 1,
  117.                             hConv, (HSZ) 0,
  118.                             CF_TEXT, XTYP_EXECUTE,
  119.                             4000L, NULL) != FALSE) {
  120.             err = BCDDE_NOERROR;
  121.         }
  122.  
  123.         // converastion is done
  124.         DdeDisconnect(hConv);
  125.     }
  126.  
  127.     if (hszService) DdeFreeStringHandle(idInst, hszService);
  128.     if (host[0] && hszTopic) DdeFreeStringHandle(idInst, hszTopic);
  129.  
  130.     return err;
  131. }
  132.  
  133.  
  134.  
  135. // ******************
  136. //
  137. //   UTIL FUNCTIONS
  138. //
  139. // ******************
  140.  
  141. #undef DDECommand
  142. #define DDECommand(a)    #a,
  143.  
  144. static LPSTR cmdTable[] = {
  145.  
  146.     #include "bcddestr.h"
  147.     NULL
  148. };
  149.  
  150. char FAR *BCDdeString(short id)
  151. {
  152.     return ((id < eCmdLast)? cmdTable[id]:NULL);
  153. }
  154.  
  155.  
  156.  
  157. // *****************
  158. //
  159. //   NET FUNCTIONS
  160. //
  161. // *****************
  162.  
  163. short BCDdeQueryHost(HWND hwnd, char FAR *pHost, short bufLen)
  164. {
  165.     LPFNWINNETBROWSE pfnBrowse;
  166.     HINSTANCE hModNet;
  167.  
  168.     // Get net DLL
  169.     if ((hModNet = (HINSTANCE)WNetGetCaps(0xFFFF)) != (HINSTANCE) 0) {
  170.  
  171.         // Load proc address
  172.         pfnBrowse=(LPFNWINNETBROWSE)GetProcAddress(hModNet, (LPSTR)(LONG)146);
  173.  
  174.         if (NULL != pfnBrowse) {
  175.  
  176.             if ((*pfnBrowse)(hwnd, "MRU_BarClock", pHost, bufLen, 0L) == WN_SUCCESS)
  177.                 return BCDDE_NOERROR;
  178.         }
  179.     }
  180.  
  181.     return BCDDE_HOSTFAIL;
  182. }
  183.  
  184. void BCDdeSetHost(char FAR *pHost)
  185. {
  186.     lstrcpyn(host, pHost, sizeof(host));
  187.     host[sizeof(host) - 1] = 0;
  188. }
  189.  
  190. void BCDdeClearHost(void)
  191. {
  192.     host[0] = 0;
  193. }
  194.  
  195.  
  196.  
  197. // ******************
  198. //
  199. //   EXEC FUNCTIONS
  200. //
  201. // ******************
  202.  
  203. short BCDdeMessage(char FAR *pMessage,
  204.                 short type)
  205. {
  206.     wsprintf(cmdBuf, "[%s(\"%s\",%d)]", BCDdeString(eCmdMessage), pMessage, type);
  207.     return BCDdeExecute(cmdBuf);
  208. }
  209.  
  210. short BCDdeCalendar(short y, short m, short d)
  211. {
  212.     wsprintf(cmdBuf, "[%s(%d,%d,%d)]", BCDdeString(eCmdCalendar), y, m, d);
  213.     return BCDdeExecute(cmdBuf);
  214. }
  215.  
  216. short BCDdePlayWave(char FAR *pName)
  217. {
  218.     return ddeStdExecute(eCmdPlayWave, pName);
  219. }
  220.  
  221. short BCDdeRunApp(char FAR *pCmdLine)
  222. {
  223.     return ddeStdExecute(eCmdRunApp, pCmdLine);
  224. }
  225.  
  226. short BCDdeTimerStart(char FAR *pName)
  227. {
  228.     return ddeStdExecute(eCmdTimerStart, pName);
  229. }
  230.  
  231. short BCDdeTimerStop(char FAR *pName)
  232. {
  233.     return ddeStdExecute(eCmdTimerStop, pName);
  234. }
  235.  
  236. short BCDdeTimerAdd(char FAR *pName,
  237.                 short tmrType,
  238.                 short dollar,
  239.                 short cent,
  240.                 short tmrInc,
  241.                 DWORD tmrLimit)
  242. {
  243.     wsprintf(cmdBuf, "[%s(\"%s\",%d,%d,%d,%d,%lu)]", BCDdeString(eCmdTimerAdd), pName, tmrType, dollar, cent, tmrInc, tmrLimit);
  244.     return BCDdeExecute(cmdBuf);
  245. }
  246.  
  247. short BCDdeTimerInfo(char FAR *pName, char FAR *pMsg, char FAR *pWave, char FAR *pApp)
  248. {
  249.     return ddeInfoExecute(eCmdTimerInfo, pName, pMsg, pWave, pApp);
  250. }
  251.  
  252. short BCDdeTimerDelete(char FAR *pName)
  253. {
  254.     return ddeStdExecute(eCmdTimerDelete, pName);
  255. }
  256.  
  257. short BCDdeAlarmAdd(char FAR *pName,
  258.                 short year, short month, short day,
  259.                 short hour, short min,
  260.                 short repeatType)
  261. {
  262.     wsprintf(cmdBuf, "[%s(\"%s\",%d,%d,%d,%d,%d,%d)]",
  263.             BCDdeString(eCmdAlarmAdd), pName, year, month, day, hour, min, repeatType);
  264.     return BCDdeExecute(cmdBuf);
  265. }
  266.  
  267. short BCDdeAlarmInfo(char FAR *pName, char FAR *pMsg, char FAR *pWave, char FAR *pApp)
  268. {
  269.     return ddeInfoExecute(eCmdAlarmInfo, pName, pMsg, pWave, pApp);
  270. }
  271.  
  272. short BCDdeAlarmDelete(char FAR *pName)
  273. {
  274.     return ddeStdExecute(eCmdAlarmDelete, pName);
  275. }
  276.  
  277. short BCDdeButtonAdd(unsigned long hookSig, BYTE btnId, Position pos)
  278. {
  279.     wsprintf(cmdBuf, "[%s(%lu,%c,%d)]", BCDdeString(eCmdButtonAdd), hookSig, btnId, (short) pos);
  280.     return BCDdeExecute(cmdBuf);
  281. }
  282.  
  283. short BCDdeButtonDelete(unsigned long hookSig, BYTE btnId)
  284. {
  285.     wsprintf(cmdBuf, "[%s(%lu,%c)]", BCDdeString(eCmdButtonDelete), hookSig, btnId);
  286.     return BCDdeExecute(cmdBuf);
  287. }
  288.  
  289. short BCDdeInstallHook(char FAR *pLibName)
  290. {
  291.     return ddeStdExecute(eCmdInstallHook, pLibName);
  292. }
  293.  
  294.  
  295.  
  296.  
  297. // *******************
  298. //
  299. //   LOCAL FUNCTIONS
  300. //
  301. // *******************
  302.  
  303. static short ddeStdExecute(short id, char FAR *pName)
  304. {
  305.     wsprintf(cmdBuf, "[%s(\"%s\")]", BCDdeString(id), pName);
  306.     return BCDdeExecute(cmdBuf);
  307. }
  308.  
  309. static short ddeInfoExecute(short id, char FAR *pName, char FAR *pMsg, char FAR *pWave, char FAR *pApp)
  310. {
  311.     // Make sure buffer length is not exceeded!
  312.  
  313.     wsprintf(cmdBuf, "[%s(\"%s\",\"%s\",\"%s\",\"%s\")]",
  314.                   BCDdeString(id), pName,
  315.                   (pMsg)? pMsg:"",
  316.                   (pWave)? pWave:"",
  317.                   (pApp)? pApp:"");
  318.  
  319.     return BCDdeExecute(cmdBuf);
  320. }
  321.  
  322.